//专门处理用户的业务逻辑
// 1. express 框架
const express = require("express");
const fs = require("fs");
const path = require("path");
// 2.创建一个后台路由
const router = express.Router();
// 导入用户数据模块
const adminModel = require("../../model/adminModel");
// 导入发送邮箱验证码工具函数
const emailApi = require("../../utils/emailApi");
// 导入jwt token工具
const JwtUtil = require("../../utils/jwt");
//导入上传文件的包
const multer = require("multer");
// 导入生成id的包
const { v4: uuidv4 } = require("uuid");
// 手机号正则表达式
const rep_phone = /^1[3-9]\d{9}$/;
// 邮箱正则表达式
const rep_email = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;

// 定制上传文件的信息（文件名、文件路径等）
const storage = multer.diskStorage({
    // 设置保存文件的路径
    destination: function (req, file, callback) {
        callback(null, "public/upload/");
    },
    filename: function (req, file, callback) {
        // 将保存文件名设置为 字段名 + 时间戳，
        // 比如 logo-1478521468943
        let suffix = file.mimetype.split("/")[1];
        //获取文件格式
        callback(null, file.fieldname + "-" + Date.now() + "." + suffix);
    },
});

// 生成的图片放入upload文件夹下
const upload = multer({ storage: storage });

// 获取服务器地址
let { HOST_URL } = require("../../config/host");
const { log } = require("console");

// 接口1: 注册功能（不需要邮箱验证码）
// URL ====> 函数
router.post("/register", async (req, res) => {
    // 解构赋值
    let { admin_acc, admin_pwd, admin_nick_name, admin_create_time } = req.body;
    // 判断账号是否为邮箱
    if (rep_email.test(admin_acc)) {
        // 生成随机字符串
        let admin_id = uuidv4();
        // 注册用户
        await adminModel
            .register(admin_id, admin_acc, admin_pwd, admin_nick_name, admin_create_time)
            .then((content) => {
                res.send(content);
            })
            .catch((error) => {
                res.send(error);
            });
    } else {
        // 数据格式不正确
        res.send({
            code: -1,
            msg: "该账号不是一个邮箱格式。",
        });
    }
});

// 接口2：发送邮件验证码
router.get("/send_code", async function (req, res) {
    let email = req.query.email;
    let rep = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
    if (rep.test(email)) {
        emailApi.Email.getEmailCode(email).then(() => {
            res.send({
                code: 200,
                msg: "验证码发送成功。",
            });
        });
    } else {
        res.send({
            code: -1,
            msg: "邮箱格式不正确。",
        });
    }
});

// 接口3: 注册功能（需要邮箱验证码）
router.post("/register2", async (req, res) => {
    // 解构赋值
    let { admin_acc, admin_pwd, admin_nick_name, admin_create_time, email_code } = req.body;
    // 判断账号是否为邮箱
    if (rep_email.test(admin_acc)) {
        // 生成随机字符串
        let admin_id = uuidv4();
        // 注册用户
        await adminModel
            .register2(admin_id, admin_acc, admin_pwd, admin_nick_name, admin_create_time, email_code)
            .then((content) => {
                res.send(content);
            })
            .catch((error) => {
                res.send(error);
            });
    } else {
        // 数据格式不正确
        res.send({
            code: -1,
            msg: "该账号不是一个邮箱格式。",
        });
    }
});

// 接口4: 登录功能（需要邮箱验证码）
// 参数：admin_acc , admin_pwd
router.post("/login2", async (req, res) => {
    let { admin_acc, admin_pwd, email_code } = req.body;
    if (admin_acc == undefined || admin_pwd == undefined) {
        res.send({
            code: -1,
            msg: "缺少参数，检查提交的方式是否正确?",
        });
        return;
    }

    if (admin_acc == false || admin_pwd == false) {
        res.send({
            code: -1,
            msg: "缺少参数，检查提交的方式是否正确?",
        });
        return;
    }
    // 如果用户把手机号码和账号进行绑定了，用户就可以使用手机号码进行登录（本身使用邮箱登录）
    if (rep_phone.test(admin_acc) || rep_email.test(admin_acc)) {
        // 调用登录方法
        await adminModel
            .login(admin_acc, admin_pwd, email_code)
            .then((data) => {
                res.send(data);
            })
            .catch((err) => {
                res.send({ code: 500, msg: "服务器异常...", err });
            });
    } else {
        res.send({
            code: -1,
            msg: "账号格式不正确?",
        });
    }
});

// 接口5：登录功能
// 参数：admin_acc , admin_pwd
router.post("/login", async (req, res) => {
    let { admin_acc, admin_pwd } = req.body;
    console.log(admin_acc, admin_pwd);
    if (admin_acc == undefined || admin_pwd == undefined) {
        res.send({
            code: -1,
            msg: "缺少参数，检查提交的方式是否正确?",
        });
        return;
    }

    if (admin_acc == false || admin_pwd == false) {
        res.send({
            code: -1,
            msg: "缺少参数，检查提交的方式是否正确?",
        });
        return;
    }
    // 如果用户把手机号码和账号进行绑定了，用户就可以使用手机号码进行登录（本身使用邮箱登录）
    if (rep_phone.test(admin_acc) || rep_email.test(admin_acc)) {
        // 调用登录方法
        await adminModel
            .login(admin_acc, admin_pwd)
            .then((data) => {
                res.send(data);
            })
            .catch((err) => {
                res.send({ code: 500, msg: "服务器异常...", err });
            });
    } else {
        res.send({
            code: -1,
            msg: "账号格式不正确?",
        });
    }
});

// 接口6：修改用户头像（上传图片/预览头像）
router.post("/upload_img", upload.single("photo"), async (req, res) => {
    // 从请求头对象获取token信息
    let token = req.headers["token"];
    // 判断用户登录状态
    // 请求需要进行token校验
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == "err") {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: "登录已过期,请重新登录。",
        });
    } else {
        // 定义路径
        let picUrl = `${HOST_URL}/upload/${req.file.filename}`;
        // 返回上传头像文件路径
        res.send({
            code: 200,
            picUrl,
            msg: "用户头像上传预览成功。",
        });
    }
});

// 接口7：保存头像路径（图片路径储存在数据库）
router.post("/save_img", async (req, res) => {
    // 从请求头对象获取token信息
    let token = req.headers["token"];
    // 获取头像路径
    let admin_avator = req.body.admin_avator;
    // console.log('admin_avator:',admin_avator);
    // 判断用户登录状态
    // 请求需要进行token校验
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == "err") {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: "登录已过期,请重新登录。",
        });
    } else {
        // 调用保存图片路径到数据库的API
        let admin_id = result.data;
        await adminModel
            .modify_avator(admin_id, admin_avator)
            .then((content) => {
                res.send(content);
            })
            .catch((err) => {
                res.send(err);
            });
    }
});

// 接口8：删除头像（删除图片）
router.post("/delete_img", async (req, res) => {
    let { admin_avator } = req.body;
    return new Promise((resolve, reject) => {
        //通过slice方法，分割出图片前面的url地址
        let index = admin_avator.indexOf("upload");
        if (index > 0) {
            let temp_path = path.join(__dirname, "../../public", admin_avator.slice(index));
            console.log("--->", temp_path);
            // fs.unlink删除文件
            fs.unlink(temp_path, function (error) {
                if (error) {
                    resolve({
                        code: -1,
                        msg: "删除图片失败。",
                    });
                } else {
                    //删除图片文件成功
                    resolve({
                        code: 200,
                        msg: "删除图片成功。",
                    });
                }
            });
        } else {
            res.send({
                code: -1,
                msg: "默认头像不用删除。",
            });
        }
    });
});

// 接口9：获取头像昵称
router.get("/get_avator_nickname", async (req, res) => {
    // 从请求头对象获取token信息
    let token = req.headers["token"] || req.query.token;
    // 判断用户登录状态
    // 请求需要进行token校验
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == "err") {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: "登录已过期,请重新登录。",
        });
    } else {
        // 调用保存图片路径到数据库的API
        let admin_id = result.data;
        await adminModel
            .get_avator_nickname(admin_id)
            .then((content) => {
                res.send(content);
            })
            .catch((err) => {
                res.send(err);
            });
    }
});

// 接口10：删除账号
router.post("/remove", async (req, res) => {
    let token = req.headers["token"];
    let { user_acc, user_id } = req.body;
    // 请求需要进行token校验
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == "err") {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: "登录已过期,请重新登录。",
        });
    } else {
        // let user_id = result.data;
        await adminModel
            .remove(user_id, user_acc)
            .then((content) => {
                res.send(content);
            })
            .catch((err) => {
                res.send(err);
            });
    }
});

// 接口10：查看用户详情
router.post("/detail", async (req, res) => {
    let token = req.headers["token"];
    let { admin_acc } = req.body;
    // 请求需要进行token校验
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == "err") {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: "登录已过期,请重新登录。",
        });
    } else {
        let admin_id = result.data;
        await adminModel
            .detail(admin_id, admin_acc)
            .then((content) => {
                res.send(content);
            })
            .catch((err) => {
                res.send(err);
            });
    }
});

// 接口11：用户分页列表
router.get("/list", async (req, res) => {
    let page_num = req.query.page_num - 0; // 页码
    let page_size = req.query.page_size - 0; // 每一页的数量
    // console.log({page_num, page_size});
    await adminModel
        .list(page_num, page_size)
        .then((content) => {
            res.send(content);
        })
        .catch((err) => {
            res.send(err);
        });
});

// 接口12：统计用户的总数量
router.get("/total", async (req, res) => {
    await adminModel
        .total()
        .then((content) => {
            res.send(content);
        })
        .catch((err) => {
            res.send(err);
        });
});

// 用户a 查询 用户a的详情
// 管理员查询 用户a的详情

// 4.把当前路由暴露在模块系统下
module.exports = router;
